//
// Created by 雷欧 on 0013 2022/11/13.
//

#include <stdio.h>
#include "string.h"
#include "stdlib.h"
#include "demo_pointer.h"

int main(){
//    int a = 10;
//    printf("%p\n",&a);
//    //指针类型 ——> 数据类型*
//    int* p = &a;
//    *p = 100;
//    printf("%p\n",p);
//
//    printf("%d\n",a);
//    printf("%d\n",*p);



//    int a = 10;
//    int* p = &a;
//    //64位小所有指针都是8字节大小
//    printf("%llu", sizeof(p));
//    puts("");
//    printf("%llu", sizeof(int*));
//    puts("");
//    printf("%llu", sizeof(char*));
//    puts("");
//    printf("%llu", sizeof(double*));
//    puts("");
//    printf("%llu", sizeof(long long*));
//    puts("");
//    printf("%llu", sizeof(float*));
//    puts("");



    //&是取地址符号，升维度
    //*是取值符号，降维度
//    char str = 'a';
//    int* p = &str;
//    *p = 123456;
//    printf("%d\n",str);
//    printf("%d\n",*p);
//
//    puts("----------------");
//    //定义指针类型要和变量的类型一致，
//    char ch = 97;
//    int* pp = &ch;
//    printf("%d\n",ch);
//    printf("%d\n",*pp);
//
//    puts("-------------------");
//    printf("%p\n",p);
//
//    printf("%p\n",&p);


    /**
     * 野指针和空指针
     */
/*
    //野指针 --> 指针变量指向一个未知的空间
    //这个100并没有赋给任何变量，它没有内存地址，指针
    int* p = 256;
    //操作野指针对应的空间可能报错
    printf("%d",*p);
    puts("");

    //空指针
    int* pp = NULL;
    //操作空指针对应的空间会报错
    *pp = 10;
    printf("%d\n",*pp);


    int* s = 1;
    //野指针 空指针后续操作都不行
//    int* s = NULL;
    int a = 100;
    int* q = &a;
    //不行
    *s = *q;
    printf("%d",*s);
*/


    /**
     * 万能指针
     */
/*
    int a = 10;
    //万能指针可以接收任意类型变量的内存地址
    void* p = &a;
    //在通过万能指针修改变量的值时，需要找到变量对应的指针类型
    *(int*)p = 100;
    printf("%llu", sizeof(void*));
    puts("");
    printf("%d", *(int*)p);
    puts("");
*/


    /**
     * const修饰的指针
     */
/*    const int a = 10;
    int* p = &a;
    *p = 100;
    printf("%d",a);*/

    /*
    *  const int*
    */
/*
    int b = 10;
    int c = 20;
    const int* pp = &c;
    //可以修改指针变量的值
    pp = &b;
    printf("%d\n",*pp);
    //不可以修改指针指向内存空间的值
    //通俗说，const离谁近就不能改谁
//    *pp = 100;//不行
*/


    /*
     * int* const
     */
/*
    int d = 10;
    int e = 20;
    int* const p = &d;
    //不能改p的值
//    p = &e;
    //可以改*p的值
    *p = 100;
    printf("%d",d);
    //可以修改指针指向内存空间的值
    //不能修改指针变量的值
*/



    /*
     * const int* const p
     */
    int a = 10;
    int b = 20;
    const int* const pp = &a;
    //都不能修改
//    pp = &e;
//    *pp = 100;
    //二级指针可以修改一级指针
    int** p2 = &pp;
    *p2 = &b;
    printf("%d",*pp);

    return 0;
}